package com.lss.wisdomwater.lib.Tool;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ThumbnailUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created by Lss on 2017/11/29.
 */

public class MediaUtil {
    /**
     * 根据指定的图像路径和大小来获取缩略图 此方法有两点好处： 1.
     * 使用较小的内存空间，第一次获取的bitmap实际上为null，只是为了读取宽度和高度，
     * 第二次读取的bitmap是根据比例压缩过的图像，第三次读取的bitmap是所要的缩略图。 2.
     * 缩略图对于原图像来讲没有拉伸，这里使用了2.2版本的新工具ThumbnailUtils，使 用这个工具生成的图像不会被拉伸。
     *
     * @param imagePath
     *            图像的路径
     * @param width
     *            指定输出图像的宽度
     * @param height
     *            指定输出图像的高度
     * @return 生成的缩略图
     */
    public static final Bitmap getImageThumbnail(String imagePath, int width,
                                                 int height) {
        Bitmap bitmap = null;
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        // 获取这个图片的宽和高，注意此处的bitmap为null
        BitmapFactory.decodeFile(imagePath, options);
        // 计算缩放比
        int h = options.outHeight;
        int w = options.outWidth;
        int beWidth = w / width;
        int beHeight = h / height;
        int be = beWidth < beHeight ? beWidth : beHeight;

        if (be <= 0) {
            be = 1;
        }

        options.inJustDecodeBounds = false; // 设为 false
        options.inSampleSize = be;
        options.inPurgeable = true;
        options.inInputShareable = true;
        // 重新读入图片，读取缩放后的bitmap，注意这次要把options.inJustDecodeBounds 设为 false
        bitmap = BitmapFactory.decodeFile(imagePath, options);
        // 利用ThumbnailUtils来创建缩略图，这里要指定要缩放哪个Bitmap对象
        bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
                ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
        return bitmap;
    }

    /**
     * 根据大小压缩图片
     */
    public static Bitmap resizeImage(String path, int size) throws IOException {
        File f = new File(path);
        InputStream temp = new FileInputStream(f);
        BitmapFactory.Options options = new BitmapFactory.Options();
        // 不为bitmap分配内存空间，只记录一些该图片的信息（例如图片大小）
        options.inJustDecodeBounds = true;
        // 通过创建图片的方式，取得options的内容(这里就是利用了java的地址传递来赋值)
        BitmapFactory.decodeStream(temp, null, options);
        temp.close();

        int i = 0;
        Bitmap bitmap = null;
        while (true) {
            // 根据要设置的大小，使宽和高都能满足
            if ((options.outWidth >> i <= size)
                    && (options.outHeight >> i <= size)) {
                // 重新取得流，注意：这里一定要再次加载，不能二次使用之前的流！
                temp = new FileInputStream(f);
                // 这个参数表示 新生成的图片为原始图片的几分之一
                options.inSampleSize = (int) Math.pow(2.0D, i);
                // 这里之前设置为了true，所以要改为false，否则就创建不出图片
                options.inJustDecodeBounds = false;

                bitmap = BitmapFactory.decodeStream(temp, null, options);
                break;
            }
            i += 1;
        }
        return bitmap;
    }
}
